using System;
using System.Web.Mvc;
using log4net;
using Matriculex.Dominio;

namespace Matriculex.UI.Controllers
{
    public class AlunoController : Controller
    {
        private readonly ILog logger = LogManager.GetLogger("LogInFile");

        //
        // GET: /Aluno/
        public ActionResult Index()
        {
            return RedirectToAction("List");
        }

        [Autorizex("Aluno")]
        public ActionResult List()
        {
            ViewData["alunos"] = Aluno.FindAllByProperty("Ativado", true);
            return View();
        }

        //
        // GET: /Aluno/Details/5
        [Autorizex("Aluno")]
        public ActionResult Details(int id)
        {
            return View();
        }

        //
        // GET: /Aluno/Create
        [Autorizex("Aluno", "Publicss")]
        public ActionResult Create()
        {
            ViewData["disciplinas"] = Disciplina.FindAllByProperty("Ativado", true);
            return View();
        } 

        //
        // POST: /Aluno/Create

        [AcceptVerbs(HttpVerbs.Post)]
        public ActionResult Create(FormCollection collection)
        {
            try
            {
                Aluno.Valida(collection["email"], collection["senha"]);

                var aluno = new Aluno();
                aluno.Nome = collection["nome"];
                aluno.Endereco = collection["endereco"];
                aluno.NumeroPECE = collection["numero_pece"];
                aluno.Email = collection["email"];
                aluno.Senha = collection["senha"];
                bool isBolsista;
                if (bool.TryParse(collection["bolsista"], out isBolsista))
                {
                    aluno.IsBolsista = isBolsista;
                }

                if (collection["disciplinas"] != null)
                {
                    string[] discIds = collection["disciplinas"].Split(',');
                    foreach (string id in discIds)
                    {
                        int disciplinaId = int.Parse(id);
                        var disciplina = Disciplina.Find(disciplinaId);
                        aluno.AdicionarDisciplina(disciplina);
                    }
                }

                aluno.Save();

                TempData["message"] = "Aluno cadastrado com sucesso!";
                return RedirectToAction("List");
            }
            catch (DominioException ex)
            {
                ViewData["error"] = ex.Message;
                return View();
            }
            catch (Exception ex)
            {
                logger.Error(ex.Message, ex);
                TempData["error"] = "Ocorreu um erro ao cadastrar o aluno.";
                return RedirectToAction("List");
            }
        }

        //
        // GET: /Aluno/Edit/5
        //[Autorizex("Aluno")]
        public ActionResult Edit(int id)
        {
            try
            {
                var aluno = Aluno.Find(id);
                return View(aluno);
            }
            catch (Exception ex)
            {
                logger.Error(ex.Message, ex);
                return RedirectToAction("List");
            }
        }

        //
        // POST: /Aluno/Edit/5

        [AcceptVerbs(HttpVerbs.Post)]
        //[Autorizex("Aluno")]
        public ActionResult Edit(int id, FormCollection collection)
        {
            var aluno = Aluno.Find(id);
            try
            {
                Aluno.Valida(collection["email"], collection["senha"]);

                aluno.Nome = collection["nome"];
                aluno.Endereco = collection["endereco"];
                aluno.Email = collection["email"];
                string bolsista = collection["bolsista"] ?? "false";
                aluno.IsBolsista = bool.Parse(bolsista);
                aluno.Senha = String.IsNullOrEmpty(collection["senha"]) ? aluno.Senha :
                    collection["senha"];
                aluno.Save();

                TempData["message"] = "Dados do aluno alterados com sucesso!";
                return RedirectToAction("List");
            }
            catch (DominioException ex)
            {
                ViewData["error"] = ex.Message;
                return aluno == null ? (ActionResult)RedirectToAction("List") : View(aluno);
            }
            catch (Exception ex)
            {
                logger.Error(ex.Message, ex);
                TempData["error"] = "Ocorreu um erro ao tentar alterar os dados do aluno.";
                return RedirectToAction("List");
            }
        }

        [AcceptVerbs(HttpVerbs.Post)]
        //[Autorizex("Aluno")]
        public ActionResult Delete(int id)
        {
            try
            {
                var aluno = Aluno.Find(id);
                aluno.Desativar();
                aluno.Save();

                TempData["message"] = "Aluno removido com sucesso!";
                return RedirectToAction("List");
            }
            catch (Exception ex)
            {
                logger.Error(ex.Message, ex);
                TempData["error"] = ex.Message;
                return RedirectToAction("List");
            }
        }
    }
}
